home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_65 / sndclass.h < prev    next >
C/C++ Source or Header  |  1995-01-01  |  4KB  |  144 lines

  1. // SndClass.h
  2. // Written by Christopher M. Box (1993).
  3.  
  4. // Contains definitions for sound classes and other globally-defined
  5. // information 
  6.  
  7. #ifndef SND_CLASSES_H
  8. #define SND_CLASSES_H
  9.  
  10. // These are constants, but you could of course make them variable and use
  11. // either an auto-detect function or some kind of installation program
  12. #define SbIOaddr 0x220
  13. #define SbIRQ 7
  14. #define SbDMAchan 1
  15. #define SbType 3
  16.  
  17. // Data directions to choose from
  18. enum { RECORD = 0, PLAY };
  19.  
  20. // SoundDevice identification codes (but only the SB device is included here)
  21. #define SB_ID 1
  22. #define CD_ID 2
  23.  
  24. // Convenient shorthand to represent a byte
  25. typedef unsigned char byte;
  26.  
  27. // Dprint is used for including debugging messages, and
  28. // incurs no overhead when DEBUG is not defined.
  29. #ifdef DEBUG
  30. #define Dprint(x) cprintf x
  31. #else
  32. #define Dprint(x)
  33. #endif
  34.  
  35. // Functions from DMA_CODE.ASM
  36. extern "C" {
  37. int dsp_reset(void);
  38. int prevent_dma(int Channel);
  39. int allow_dma(int Channel);
  40. int dma_setup(int Channel,byte far *Buffer,unsigned Length,int Dir);
  41. unsigned dma_count(int Channel);
  42. unsigned dma_addr(int Channel);
  43. }
  44. extern int dma_errno;
  45. extern char far *dma_errlist[];
  46.  
  47. void mem_error(void);
  48.  
  49. // Base sound device class, from SoundDev.cpp
  50.  
  51. class SoundDevice {
  52. public:
  53.     virtual int identify(void) = 0;
  54.     virtual int install_ok(void) = 0;
  55.     virtual void halt(void) = 0;
  56.     virtual void cont(void) = 0;
  57.     virtual void reset(void) = 0;
  58.     void file_dma(int handle, byte far *buf, unsigned bufsize, long len, byte dir);
  59.     void monitor_input(byte far *dmabuf, unsigned blocklen);
  60.     virtual void buf_dma_start(byte far *buffer, unsigned buflen, byte dir) = 0;
  61.     virtual int buf_dma_lo(unsigned len) = 0;
  62.     virtual int buf_dma_hi(unsigned len, unsigned next_buflen) = 0;
  63.     virtual unsigned dma_addr(void) = 0;
  64.     virtual unsigned get_rate(void) = 0;
  65.     virtual unsigned get_width(void) = 0;
  66.     virtual void set_rate(unsigned rate, byte dir) = 0;
  67.     virtual int get_chan(void) = 0;
  68. private:
  69.     int disk_io(int handle, byte far *buf, unsigned len, byte dir);
  70.     void setsizes(unsigned &bufsize, long &len, unsigned &lo_sz, unsigned &hi_sz);
  71.     unsigned dt_min, dt_max;
  72. };
  73.  
  74. // Soundblaster functions from SbDevice.cpp
  75.  
  76. void far interrupt sb_buf_dma_int(...);
  77. void far interrupt sb_dummy_int(...);
  78.  
  79. class SbDevice : public SoundDevice {
  80. public:
  81.     SbDevice(void);
  82.     ~SbDevice(void);
  83.     int identify(void) { return SB_ID; }
  84.     int install_ok(void) { return exists; }
  85.     void halt(void);
  86.     void cont(void);
  87.     void reset(void) { dsp_reset(); }
  88.     void voice(int state);
  89.     void set_rate(unsigned rate, byte dir);
  90.     unsigned get_rate(void) { return rate; }
  91.     unsigned get_width(void) { return 1U; }
  92.     int get_hs(void) { return hi_speed; }
  93.     void buf_dma_start(byte far *buffer, unsigned buflen, byte dir);
  94.     int buf_dma_lo(unsigned len);
  95.     int buf_dma_hi(unsigned len, unsigned next_buflen);
  96.     unsigned dma_addr(void) { return ::dma_addr(SbDMAchan); }
  97.     int get_chan(void) { return SbDMAchan; }
  98. private:
  99.     void dsp_cmd(byte cmd);
  100.     void init_irq(void);
  101.     void deinit_irq(void);
  102.     void set_sb_cmds(unsigned buflen);
  103.     int process_keys(void);
  104.  
  105.     void interrupt far (*OldIRQ)(...);
  106.     byte exists;
  107.     byte hi_speed;
  108.     unsigned sb_size, lo_buf_sz;
  109.     unsigned rate;
  110.     byte direction;
  111. };
  112.  
  113. // Defines for SB IO addresses
  114. #define DSP_RESET           SbIOaddr+0x06
  115. #define DSP_READ_DATA       SbIOaddr+0x0A
  116. #define DSP_WRITE_DATA      SbIOaddr+0x0C
  117. #define DSP_WRITE_STATUS    SbIOaddr+0x0C
  118. #define DSP_DATA_AVAIL      SbIOaddr+0x0E
  119.  
  120. // SB DSP Command codes
  121. #define DIRECT_8_BIT_DAC    0x10
  122. #define DMA_8_BIT_DAC        0x14
  123. #define DMA_2_BIT_DAC        0x16
  124. #define DMA_2_BIT_REF_DAC   0x17
  125. #define DIRECT_ADC            0x20
  126. #define DMA_ADC             0x24
  127. #define TIME_CONSTANT        0x40
  128. #define DMA_4_BIT_DAC        0x74
  129. #define DMA_4_BIT_REF_DAC   0x75
  130. #define DMA_26_BIT_DAC        0x76
  131. #define DMA_26_BIT_REF_DAC  0x77
  132. #define HALT_DMA        0xD0
  133. #define CONTINUE_DMA    0xD4
  134. #define SPEAKER_ON        0xD1
  135. #define SPEAKER_OFF        0xD3
  136. #define DSP_ID            0xE0
  137. #define DSP_VER         0xE1
  138.  
  139. #define SET_HS_SIZE 0x48
  140. #define HS_DAC 0x91
  141. #define HS_ADC 0x99
  142.  
  143. #endif
  144.